Classificationを用いて個人情報を持つカラムを自動分類・自動タグ付けをしてみた #SnowflakeDB
※本エントリは、Snowflakeをもっと使いこなそう! Advent Calendar 2022の15日目の記事となります。
さがらです。
SnowflakeのClassificationを用いて個人情報を持つカラムを自動分類・自動タグ付けを試してみたので、その内容をまとめてみます。
Classificationとは
Snowflake社が事前構築済の機械学習モデルを用いて、テーブル内の各カラムの内容とメタデータを分析し、個人情報に分類し、分類された内容に基づいてタグ付けまで行うことができる機能です。
Snowflakeには元々、タグ付けの機能やタグベースのマスキングポリシーなどの機能はありますが、これらの機能は基本的には管理者が手動でタグ付けをしないといけません。しかし、このClassificationを使うことで、Snowflakeが事前構築した機械学習モデルに合致するカラムであれば、自動でタグ付けを行うことが可能です。
下図はSnowflake公式のブログからの引用ですが、このような個人情報に分類することができるようです。
試してみた
早速、Classificationを試してみたいと思います!
対象のテーブル
SNOWFLAKE_SAMPLE_DATA
データベースのTPCDS_SF10TCL
スキーマの、CUSTOMER
テーブルから先頭1万行だけをSELECTしてテーブルを作成し、このテーブルを対象とします。カラム数は18個あります。
データの内容としては下図のような内容になります。名前、3カラムに分かれた生年月日、メールアドレス、などの個人情報が含まれていますね。
EXTRACT_SEMANTIC_CATEGORIES関数を使い、推奨されるタグを確認
まず、EXTRACT_SEMANTIC_CATEGORIES
という関数を用いて、Classification機能により各カラムに対して推奨されるタグの値を確認してみます。
実行するSQLは下記のようになります。引数は1つだけで対象のテーブル名を入れればOKです。
-- タグの推奨値の確認 select extract_semantic_categories('customer');
XSのシングルクラスタのウェアハウスで実行してみると、40秒ほど経って結果が返ってきました。結果はJSON形式で返ってきます。分類されたカラムには4つの値が付与されていることがわかります。
この分類されたカラムが持つ4つの値ですが、このような仕様となっております。
extra_info.alternates
:semantic_category
に示した値が正しい確率が80%未満である時に表示される、値の代替案(代替案の正しい確率は、15%~80%の間のようです。)extra_info.probability
:semantic_category
に示した値が正しい確率。"1.00"が最高で、100%を意味するprivacy_category
:Classification機能により生成されるPRIVACY_CATEGORY
というタグに紐づける値。IDENTIFIER
、QUASI_IDENTIFIER
、SENSITIVE
の3種類。semantic_category
:Classification機能により生成されるSEMANTIC_CATEGORY
というタグに紐づける値。詳細はこちらの公式Docをご確認ください。
結果を見ると、下記の5つのカラムに対して結果が返ってきていました。
C_BIRTH_COUNTRY
extra_info.alternates
:[]extra_info.probability
:"0.99"privacy_category
:"QUASI_IDENTIFIER"semantic_category
:"COUNTRY"
C_BIRTH_YEAR
extra_info.alternates
:[]extra_info.probability
:"0.96"privacy_category
:"QUASI_IDENTIFIER"semantic_category
:"YEAR_OF_BIRTH"
C_EMAIL_ADDRESS
extra_info.alternates
:[]extra_info.probability
:"1.00"privacy_category
:"IDENTIFIER"semantic_category
:"EMAIL"
C_FIRST_NAME
extra_info.alternates
:[]extra_info.probability
:"1.00"privacy_category
:"IDENTIFIER"semantic_category
:"NAME"
C_LAST_NAME
extra_info.alternates
:[]extra_info.probability
:"1.00"privacy_category
:"IDENTIFIER"semantic_category
:"NAME"
個人的には、C_BIRTH_MONTH
とC_BIRTH_DAY
が検知されていなかったのが気になったのですが、ClassificationではDATE_OF_BIRTH
というsemantic_category
はあるものの、MONTHとDAYに分かれている場合は対応が難しいようですね。
ASSOCIATE_SEMANTIC_CATEGORY_TAGSストアドプロシージャを用いてタグ付けを行う
続いて、ASSOCIATE_SEMANTIC_CATEGORY_TAGS
というストアドプロシージャを用いて、EXTRACT_SEMANTIC_CATEGORIES
関数が返した分類でタグ付けを行います。
実行するSQLは下記のようになります。1つ目の引数に対象のテーブル名、2つ目の引数にはEXTRACT_SEMANTIC_CATEGORIES
関数を指定することで実行可能です。
-- タグ付けの実行 call associate_semantic_category_tags('customer',extract_semantic_categories('customer'));
XSのシングルクラスタのウェアハウスで実行してみると、38秒ほど経って結果が返ってきました。
では、正しくタグが付与されているかを確認してみます!
ACCOUNT_USAGEのTAG_REFERENCESビューからも確認可能なのですが、すぐに反映されないため、INFORMATION_SCHEMAのTAG_REFERENCESテーブル関数を用いて、C_LAST_NAME
にタグが適用されたかを確認してみます。
-- `C_LAST_NAME`列にタグ付けされたことを確認 select * from table(sagara_rawdata_db.information_schema.tag_references('customer.c_last_name', 'COLUMN'));
下図が上述のクエリを実行して返って来た結果ですが、無事に2つのタグが付与されていることを確認できました!
あとは、マスキングポリシーを各タグに適用すれば、自分でタグ付けをセずともマスキングが行なえますね!(タグベースのマスキングポリシーについては、先日ブログを書いておりますのでこちらも併せてご覧ください。)
最後に
SnowflakeのClassificationを用いて個人情報を持つカラムを自動分類・自動タグ付けを試してみました。
記事に書いたクエリを見るとわかると思いますが、非常に簡単に実装可能です!まずは一度EXTRACT_SEMANTIC_CATEGORIES
関数を使っていただいて、どのように分類されるか確認してみることをオススメします。